package controles;

import juego.Escenario;
import movimiento.Posicion;
import objetos.ObjetoMovil;
import objetos.aeronaves.*;
import objetos.aeronaves.enemigos.AvionGuia;

/*
 * Control que hace entrar a las aeronaves que est�n en reserva al juego. Chequea
 * si el nivel est� en condiciones de ser terminado para hacer entrar al avi�n gu�a.
 */
public class ControlEntradaAeronaves implements Control {
	private boolean estaElGuia = false;
	private boolean nivelTerminando = false;

	public void ejecutar() {

		/*
		 * Si se llego al tope de puntos, se termina el nivel, o se llama al
		 * avionGuia.
		 */
		if (Escenario.getInstance().getActor().getPuntaje() >= Escenario
				.getInstance().getTopePuntaje()
				&& !nivelTerminando) {
			this.terminarNivel();
		}

		int cantAeronavesEnJuego = Escenario.getInstance().getEnemigos().size()
				+ Escenario.getInstance().getCiviles().size();
		if (cantAeronavesEnJuego < 8) {
			boolean hayAeronavesEnReserva = Escenario.getInstance()
					.getAeronavesEnReserva().size() > 0;
			boolean quedanEnemigos = Escenario.getInstance()
					.getCantEnemigosEnReserva() > 0;
			boolean hayEnemigosEnJuego = Escenario.getInstance().getEnemigos()
					.size() > 0;
			if (hayAeronavesEnReserva && quedanEnemigos) {
				if (!estaElGuia) {
					this.agregarAeronave(Escenario.getInstance()
							.getAeronaveEnReserva());
				}
			} else if (!hayEnemigosEnJuego) {
				terminarNivel();
			}
		}
	}

	private void crearYAgregarAvionGuia() {
		int x = Escenario.getInstance().getMaxX() / 2;
		int y = 1;
		AvionGuia guia = new AvionGuia(x, y);

		Escenario.getInstance().agregarObjeto(guia);
		this.estaElGuia = true;
	}

	private void agregarAeronave(ObjetoMovil aeronave) {
		if (aeronave.esAliado()) {
			this.agregarCivil(aeronave);
		} else {
			this.agregarEnemigo(aeronave);
		}
	}

	private void agregarCivil(ObjetoMovil aeronave) {
		int x = 1;
		int y = Escenario.getInstance().getMaxY()
				/ this.generarRandomParaEntrada();
		aeronave.setPosicion(new Posicion(x, y));
		Escenario.getInstance().agregarObjeto((Civil) aeronave);
	}

	private void agregarEnemigo(ObjetoMovil aeronave) {
		int cantEnemigos = Escenario.getInstance().getCantEnemigosEnReserva();
		int x = Escenario.getInstance().getMaxX()
				/ this.generarRandomParaEntrada();
		int y = 1;
		aeronave.setPosicion(new Posicion(x, y));
		Escenario.getInstance().agregarObjeto((Enemigo) aeronave);
		Escenario.getInstance().setCantEnemigosEnReserva(--cantEnemigos);
	}

	private int generarRandomParaEntrada() {
		/*
		 * Devuelve un numero aleatorio para determinar a que altura del borde
		 * ingresa
		 */
		int particiones = 6;
		return (int) Math.round(Math.random() * (particiones - 2) + 2);
	}

	private void terminarNivel() {
		nivelTerminando = true;
		boolean hayAvionGuia = Escenario.getInstance().getHayAvionGuia();
		if (hayAvionGuia) {
			if (estaElGuia) {
				return;
			} else {
				this.crearYAgregarAvionGuia();
			}
		} else {
			Escenario.getInstance().finNivel();
		}
	}

}
